package com.df.my_net_game.net.base;

import com.df.my_net_game.game_rpc.EzGameMsg;
import io.netty.buffer.ByteBuf;
import io.netty.channel.ChannelFuture;
import io.netty.channel.ChannelHandlerContext;
import io.netty.channel.ChannelPipeline;
import io.netty.handler.timeout.IdleStateEvent;

/**
 * 连接新建流程：
 * 连接建立->handlerAdded -> channelRegistered -> channelActive -> channelRead
 *
 * 连接关闭流程：
 * channelReadComplete -> channelInactive ->channelUnregistered -> handlerRemoved ->连接关闭
 *
 * tcp和websocket都可以实现这个
 */
public interface IServerCB<T> {


    //===================================[ 服务器生命周期_Start ]===========================================

    /**
     * 服务器启动成功执行
     */
    public void onServerStartSuccess(ChannelFuture future, GTcpServer server);

    /**
     * 服务器启动失败执行
     * @param server
     */
    public void onServerStartFailure(ChannelFuture future,GTcpServer server);

    //===================================[ 服务器生命周期_End ]===========================================

    //===================================[ 单个链接的生命周期_Start ]===========================================


    /**
     * 连接初始化时调用，用于添加自定义处理器
     */
    public void onChannelInit(ChannelPipeline pipeline, GTcpServer server);

    /**
     * 连接建立成功，channelActive 后执行
     */
    public void onConnected(ChannelHandlerContext ctx,GTcpServer server);

    /**
     * 出现异常情况
     */
    public void onException(ChannelHandlerContext ctx, Throwable cause,GTcpServer server);
//    /**
//     * 接收到一个客户端的完整二进制消息后调用，一般来根据自定义消息协议解析出消息头，消息体等内容
//     */
//    public Object onReceiveMsg(ChannelHandlerContext ctx, byte[] msg, GTcpServer server);
    /**
     * 接收到一个消息后调用，用于对消息进一步处理，返回null的话后续就不会处理这个消息了
     */
    public EzGameMsg onReceiveMsg(EzGameMsg msg, GTcpServer server);
    /**
     * 向channel写入消息前的执行
     *
     * @return
     */
    public  EzGameMsg onBeforeSendMsg(EzGameMsg respMsg, GTcpServer server);

    /**
     * 连接关闭，在handlerRemoved后执行
     */
    public void onDisconnected(ChannelHandlerContext ctx,GTcpServer server);

    /**
     * 空闲时回调
     */
    public void onDIdle(ChannelHandlerContext ctx, IdleStateEvent event,GTcpServer server);

    //===================================[ 单个链接的生命周期_End ]===========================================
}
